//
// 循环队列
// Created by 麻再挺 on 2021/12/9.
//

#ifndef DATA_STRUCTURE_C_CYCLE_QUEUE_H
#define DATA_STRUCTURE_C_CYCLE_QUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include "./../constant.h"

/**
 * 最大队列长度
 * 实际队列长度为 MAXSIZE - 1
 */
#define MAXSIZE 10

/**
 * 队列类型
 */
typedef int CQElemType;

/**
 * 队列结点
 */
typedef struct {
    /**
     * 初始化分配的内存空间
     */
    CQElemType *base;
    /**
     * 头指针, 如果队列不空, 指向队列首元素
     */
    int front;
    /**
     * 尾指针, 如果队列不空, 指向队尾元素的下一个位置
     */
    int rear;
}CQQueue;

/**
 * 初始化队列
 */
Status Cycle_Queue_Init(CQQueue *queue);

/**
 * 销毁队列
 */
Status Cycle_Queue_Destroy(CQQueue *queue);

/**
 * 清空队列
 */
Status Cycle_Queue_Clear(CQQueue *queue);

/**
 * 判断队列是否为空
 */
Status Cycle_Queue_Empty(CQQueue *queue);

/**
 * 队列长度
 */
int Cycle_Queue_Length(CQQueue *queue);

/**
 * 获取队列头
 * @param queue 队列
 * @param elem 元素
 * @return
 */
Status Cycle_Queue_GetHead(CQQueue *queue, CQElemType *elem);

/**
 * 入队
 * @param queue 队列
 * @param elem 数据
 * @return
 */
Status Cycle_Queue_Enter(CQQueue *queue, CQElemType elem);

/**
 * 出队
 * @param queue 队列
 * @param elem 元素
 * @return
 */
Status Cycle_Queue_Deter(CQQueue *queue, CQElemType *elem);

/**
 * 队列打印
 * @param queue 队列
 */
void Cycle_Queue_Print(CQQueue *queue);


#endif //DATA_STRUCTURE_C_CYCLE_QUEUE_H
